

%{

//Sergio Navarro Perez
//Pablo Pellicer Javier
//Andres Garcia Morro

	#include <stdio.h>
	#include "cabecera.h"
	//#include "libtds.h"
	//#include "libgci.h"	
	#include "asin.h"
	
	#define MAX_LENGTH 14
	#define Devolver(x) if (verbosidad) ECHO; return x;
	void creaNombre();
	void creaCentera();
	void truncCreal();
	extern FILE *yyin;
	void visualizar(int opcion, char* texto);

%}


%option yylineno

delimitador [ \t\n]+
entero [0-9]+
letra [A-Za-z]
comentario "//".*\n



%%
{delimitador}				{if(verbosidad)ECHO;}
"int"					{Devolver(INT_);}
"("     		       		{Devolver(PARABR_);}
")"					{Devolver(PARCER_);}
"{"					{Devolver(LLAVABR_);}
"}"					{Devolver(LLAVCER_);}
"["					{Devolver(CORABR_);}
"]"					{Devolver(CORCER_);}
";"					{Devolver(PUNTOYCOMA_);}
"."					{Devolver(PUNTO_);}
","					{Devolver(COMA_);}	
"+"					{Devolver(MAS_);}
"*"					{Devolver(POR_);}
"-"					{Devolver(MENOS_);}
"/"					{Devolver(DIV_);}
"="					{Devolver(IGUAL_);}
"+="					{Devolver(MASIGUAL_);}
"-="					{Devolver(MENOSIGUAL_);}
"=="					{Devolver(IGUALIGUAL_);}
"!="					{Devolver(DESIGUAL_);}
"<"					{Devolver(MENORQUE_);}
">"					{Devolver(MAYORQUE_);}
"<="					{Devolver(MENORIGUAL_);}
">="					{Devolver(MAYORIGUAL_);}
"++"					{Devolver(MASMAS_);}
"--"					{Devolver(MENOSMENOS_);}
"struct"				{Devolver(STRUCT_);}
"read"					{Devolver(READ_);}
"print"					{Devolver(PRINT_);}
"if"					{Devolver(IF_);}
"else"					{Devolver(ELSE_);}
"for"					{Devolver(FOR_);}
"return"				{Devolver(RETURN_);}
{entero}                		{creaCentera(); Devolver(CTE_);}
[0-9]+"."[0-9]*				{truncCreal(); Devolver(CTE_);}
{comentario}*				{if(verbosidad)ECHO;}
[A-Za-z][A-Za-z0-9]*			{creaNombre(); Devolver(ID_);}
.					{char cadena[100];
					 sprintf (cadena,"Encontrado caracter desconocido '%s'",yytext);
					 yyerror (cadena);}


%%


void creaNombre(){ 
	char *t;
	if (yyleng > MAX_LENGTH) {
		if ( verbosidad )
		 	fprintf(stdout,"Warning at line %d: identificador truncado a longitud %d\n",yylineno, MAX_LENGTH);
		yyleng=MAX_LENGTH;
	}
	t = (char *)malloc(yyleng+1); strncpy(t, yytext, yyleng);
	t[yyleng] = '\0'; yylval.ident = t;
}

void creaCentera(){ 
	yylval.cent = atoi(yytext); 
}

void truncCreal(){ 
	char *t;
	fprintf(stdout,"Warning at line %d: constante real truncada a entera\n", yylineno);
	yyleng = strcspn(yytext,".");
	t = (char *)malloc(yyleng+1); strncpy(t, yytext, yyleng);
	t[yyleng] = '\0'; yylval.cent = atoi(t);
}
